Low Flow Advisory
Overview This advisory shows sites that are exhibiting low flow conditions. It contains a synopsis of current conditions, and tables of sites that are experiencing low flow conditions (arranged by Regional Management District). Specifically, this advisory shows stream sites that have dropped below their 10th percentile for seven day mean discharge. This corresponds to a Level 3 drought or worse within the BC Drought Response Plan.
Synopsis of Conditions Continued precipitation deficits continue to impact streamflows throughout southern BC and (less so) into the Peace region. The combination of these deficits, as well as increased demand from both human and ecological systems due to heat, has translated into decreased streamflow, especially within smaller systems but also beginning to show up in larger systems.
Advisory - Sites at Low (<10th percentile) Seven Day Streamflow Percentiles Seven Day average streamflow percentiles compare current stream flows (averaged over the last seven days) to the same seven day period in a site’s historic record. Streamflows are averaged over seven days to minimize the impact of short term fluctuations, and gives a better representation of the overall trend in streamflow. Percentiles give an indication of how likely a seven day streamflow value is; for example, the 50th percentile represents normal conditions, where a streamflow percentile of 10 indicates that this value has occurred only 10% of the time within the history of the site. Data is sourced from real-time and historic Water Survey of Canada data. The seven day average streamflow is a core indicator for determining the level of drought within a specific region and watershed according to the Drought Response Plan (2021).
# ------------------
# Assign each of the sites to a natural resource region and sort by Natural Resource Region
# Convert to spatial object
table_sf <- sf::st_as_sf(
table_stats_new %>% dplyr::filter(!is.na(LONGITUDE)),
coords = c("LONGITUDE", "LATITUDE"),
crs = 4326,
agr = "constant"
) %>%
bcmaps::transform_bc_albers() %>%
st_transform(4326)
# Get the polygons for each of the natural resource regions
regions <- bcmaps::nr_regions() %>%
st_transform(4326)
# ensure that the crs is correct
regions <- st_transform(regions, CRS("+init=epsg:4326"))
table_sf <- st_transform(table_sf, CRS("+init=epsg:4326"))
# Function for assigning natural resource region
assign_region <- function(region_i, region_name) {
region_select <- region_i %>%
dplyr::filter(REGION_NAME == region_name) %>%
dplyr::select(REGION_NAME, geometry)
out <- sf::st_join(table_sf, region_select,
left = FALSE)
}
# Apply function over all regions
table_region_list <- lapply(unique(regions$REGION_NAME),
assign_region,
region_i = regions)
# Unfold
table_region <- data.table::rbindlist(table_region_list) %>%
dplyr::select(-geometry) %>%
dplyr::full_join(table_stats_new) %>%
dplyr::filter(!is.na(LONGITUDE)) %>%
sf::st_as_sf(
coords = c("LONGITUDE", "LATITUDE"),
crs = 4326,
agr = "constant"
) %>%
bcmaps::transform_bc_albers()%>%
st_transform(4326)
Joining, by = c("Station Name", "ID", "Record Length", "Basin Area (km2)", "Regulation Status", "Last 24 hour Q (m3/s)", "Percentile - Last 24 Hour Q", "pct_bin_24hours", "Latest 7 Day Q (m3/s)", "Percentile - Q7", "pct_bin_7day", "Percent of Daily Mean Q7 (%; Historic Mean Q7 in m3/s)", "Percent of Daily Median Q7 (%; Historic Median Q7 in m3/s)", "Historic Min 7 Day Q (m3/s)", "MAD (m^3/s)", "% MAD", "MAD_bin", "Mean max temp from last 7 days (degC)", "Max temp over last 24 hours (degC)", "Dates above 23 degC in last 7 days", "Dates above 20 degC in last 7 days", "Date", "per_q7", "q7_per_thresh")
# -----------------
# Add in the drought polygon
drought <- bcdroughtstatistics::scrape_drought_map() %>%
as("Spatial") %>%
sp::spTransform(CRS("+proj=longlat +datum=WGS84")) %>%
sp::spTransform(CRS("+init=epsg:4326"))
[1] "Feature Layer"
[1] "esriGeometryPolygon"
drought_st <- st_make_valid(st_as_sf(drought, 4326)) %>%
st_transform(4326) %>%
sf::st_as_sf(
coords = c("LONGITUDE", "LATITUDE"),
crs = 4326,
agr = "constant"
) %>%
bcmaps::transform_bc_albers() %>%
dplyr::select(BasinName, geometry) %>%
st_transform(4326)
# Function for assigning the drought polygon
assign_droughtregion <- function(drought_p, drought_polygon_i) {
drought_select <- drought_p %>%
dplyr::filter(BasinName == drought_polygon_i)
out <- sf::st_join(table_region, drought_select,
left = FALSE)
if (dim(out)[1] == 0) {
out_i <- NULL
} else {
out_i <- out
}
}
# Run function over all drought polygons
table_drought_list <- lapply(unique(drought_st$BasinName),
assign_droughtregion,
drought_p = drought_st)
table_droughtbasin <- data.table::rbindlist(table_drought_list, fill = TRUE, use.names=TRUE)
# -----------------
# Add in the Drought Level by the percentile
table_droughtbasin_level <- table_droughtbasin %>%
dplyr::mutate(drought_level = case_when(
is.na(`Percentile - Q7`) ~ "Not ranked",
`Percentile - Q7` <= 2 ~ "Drought Level 5",
`Percentile - Q7` > 2 & `Percentile - Q7` <= 5 ~ "Drought Level 4",
`Percentile - Q7` > 5 & `Percentile - Q7` <= 10 ~ "Drought Level 3",
`Percentile - Q7` > 10 & `Percentile - Q7` <= 20 ~ "Drought Level 2",
`Percentile - Q7` > 20 & `Percentile - Q7` <= 30 ~ "Drought Level 1",
`Percentile - Q7` > 30 & `Percentile - Q7` <= 5 ~ "Drought Level 0"
)) %>%
dplyr::arrange(REGION_NAME, `Percentile - Q7`, BasinName) %>%
dplyr::rename(`Natural Resource Region` = REGION_NAME, `Drought Region` = BasinName) %>%
tidyr::extract(geometry, c('LONGITUDE', 'LATITUDE'), '\\((.*), (.*)\\)', convert = TRUE)
# Filter to those below their 10th percentile - drought level 3 or below
table_10 <- table_droughtbasin_level %>%
dplyr::filter(`Percentile - Q7` <= 10)
Map of all seven day percentiles - map of all sites with seven day percentile less than 10 - Option to add the drought polygons and management areas on map
The below map shows all sites within the prvince of BC whose 7 day mean streamflow percentile has dropped below the 10th percentile. Both the regions used to determine drought levels (Drought Basins) or the Natura Resource Management area may be added to the map.
# Create basemap for the interactive map - this will allow you to simply add layers to the basemap
# Expected NAWW percentile bins
expected <- c("Not ranked",
"Drought Level 5",
"Drought Level 4",
"Drought Level 3")
naww_pal <- c("#FFFFFF","#730000","#E60000", "#E69800")
pal <- colorFactor(palette = c("#730000","#E60000", "#e69800"),
domain = c("Drought Level 5", "Drought Level 4", "Drought Level 3"))
wardpal <- colorFactor(viridis::viridis(7), regions$REGION_NAME)
# Get the center of each natural resource area for labels
centers <- data.frame(rgeos::gCentroid(as(regions, Class = 'Spatial'), byid = TRUE))
centers$region <- regions$REGION_NAME
basemap <- leaflet() %>%
addProviderTiles("Esri.WorldTopoMap") %>%
fitBounds(48, 50, -139, -120) %>%
setView( lng = -126, lat = 54.2, zoom = 5 ) %>%
addMapPane("Natural Resource Districts", zIndex = 400) %>%
addMapPane("BC Provincial Drought Polygons", zIndex = 405) %>%
addLayersControl(baseGroups = c("Natural Resource Districts", "BC Provincial Drought Polygons"),
options = layersControlOptions(collapsed = F)) %>%
addLayersControl(overlayGroups = c("Natural Resource Districts", "BC Provincial Drought Polygons"),
options = layersControlOptions(collapsed = F)) %>%
addPolygons(data = drought,
group = "BC Provincial Drought Polygons",
weight = 3,
color = '#2900b6',
fillColor = '#white',
fillOpacity = 0, # completely opaque BC Provincial Drought Polygons for now
highlightOptions = highlightOptions(color = '#00cccc', weight = 3,
bringToFront = TRUE),
label = ~drought@data$BasinName,
popup = paste0("Drought Level = ", drought@data$DroughtLevel),
options = pathOptions(pane = "BC Provincial Drought Polygons")) %>%
addPolygons(data = regions,
group = "Natural Resource Districts",
weight = 3,
#color = 'black',
color = ~wardpal(regions$REGION_NAME),
fillOpacity = 0.2,
highlightOptions = highlightOptions(color = "black", weight = 3,
bringToFront = FALSE),
label = regions$REGION_NAME,
options = pathOptions(pane = "Natural Resource Districts")) %>%
# Add natural resource regions as markers
addLabelOnlyMarkers(data = centers,
group = "Natural Resource Districts",
lng = ~x, lat = ~y, label = ~region,
labelOptions = labelOptions(noHide = TRUE, direction = 'top'))
# Plot interactive plot
basemap %>%
addMapPane("Streamflow - Seven Day Percentiles", zIndex = 410) %>%
addMapPane("Streamflow - Last 24 Hour Percentiles", zIndex = 420) %>%
addLayersControl(baseGroups = c("Streamflow - Seven Day Percentiles",
"Streamflow - Last 24 Hour Percentiles",
"BC Provincial Drought Polygons",
"Natural Resource Districts"),
options = layersControlOptions(collapsed = FALSE)) %>%
addLayersControl(overlayGroups = c("Streamflow - Seven Day Percentiles",
"Streamflow - Last 24 Hour Percentiles",
"BC Provincial Drought Polygons",
"Natural Resource Districts"),
options = layersControlOptions(collapsed = F)) %>%
addCircleMarkers(data = table_10,
lng = ~LONGITUDE,
lat = ~LATITUDE,
group = "Streamflow - Seven Day Percentiles",
radius = 5,
fillColor = ~pal(as.factor(table_10$drought_level)),
fillOpacity = 1,
color = "black", opacity = 0.7, weight = 1.5,
popup = paste0(table_10$`Station Name`,", ", table_10$`ID`, "<br>",
"Seven Day Discharge (m3/s) = ", round(table_10$`Latest 7 Day Q (m3/s)`, digits = 2), "<br>",
"7 Day Discharge Percentile = ", round(table_10$`Percentile - Q7`, digits = 0), " | Category: ", table_10$q7_per_thresh, "<br>",
"Drought Level: ", table_10$drought_level, "<br>",
"<a href=\"", "https://wateroffice.ec.gc.ca/report/real_time_e.html?stn=", table_10$`ID`, "\" target='_blank'>Link to realtime WSC website (new tab)</a>", "<br>",
"<a href=\"", "http://bcrfc.env.gov.bc.ca/lowflow/drought_interactive/", table_10$`ID`, ".html", "\" target='_blank'>Link to Interactive Hydrograph (new tab)</a>"),
label = ~paste0(table_10$`Station Name`,", ", table_10$`ID`, " ", table_10$q7_per_thresh),
options = pathOptions(pane = "Streamflow - Seven Day Percentiles")) %>%
# Last 24 hours
addCircleMarkers(data = table_10,
lng = ~LONGITUDE, lat = ~LATITUDE,
group = "Streamflow - Last 24 Hour Percentiles",
radius = 5,
fillColor = ~pal(as.factor(table_10$drought_level)),
fillOpacity = 1,
color = "black", opacity = 0.7, weight = 1.5,
popup = paste0(table_10$`Station Name`,", ", table_10$`ID`, "<br>",
"Discharge Over Last 24 Hours (m3/s) = ", round(table_10$`Last 24 hour Q (m3/s)`, digits = 2), "<br>",
"Percentile = ", round(table_10$`Percentile - Last 24 Hour Q`, digits = 0), "<br>",
"Percentile Category: ", table_10$pct_bin_24hours, "<br>",
"<a href=\"", "https://wateroffice.ec.gc.ca/report/real_time_e.html?stn=", table_10$`ID`, "\" target='_blank'>Link to realtime WSC website (new tab)</a>", "<br>",
"<a href=\"", "http://bcrfc.env.gov.bc.ca/Real-time_Data/Interactive_Q_process/InteractivePlots/dailyQ_interactive/", table_10$`ID`, "_dailyQ.html", "\" target='_blank'>Link to Interactive Hydrograph (new tab)</a>"),
label = ~paste0(table_10$`Station Name`,", ", table_10$`ID`, " ", table_10$pct_bin_24hours),
options = pathOptions(pane = "Streamflow - Last 24 Hour Percentiles")) %>%
addLegend(colors = naww_pal,
labels = expected,
title = paste0("7 Day Streamflow Percentile Colours"))